---! 映射表
local users_map = {}

-------------------------------------------------------------------------------
---! 对外接口
-------------------------------------------------------------------------------
LOGIN_D = {}

---! 登录
function LOGIN_D:login(agent_ob)
    local user_id = agent_ob:get_user_id()
    local steam_id = agent_ob:get_user_name() --user_name就是steam_id
    if not user_id or not steam_id then
        spdlog.warn("logind", string.format("member[user_id] type error, data : %s", agent_ob));
        return
    end

    spdlog.debug("logind", string.format("client [%s] from [%s] try do login user [%s:%s].",
                                         agent_ob:get_id(), agent_ob:get_gate_channel(), user_id, steam_id))
    
    STEAM_D:set_steam_id_by_user_id(user_id,steam_id)

    ---! 查找用户对象
    local user_ob = USER_D:find_user(user_id)
    if not user_ob then
        ---! 对象尚未加载，需要做防重入处理，避免多次加载对象
        if USER_D:is_loading(user_id) then
            spdlog.debug("logind", string.format("user [%s] is loading....", user_id))
            ---! 通知客户端下线
            agent_ob:kickout(1001)
            return
        end

        ---! 开始加载对象
        user_ob = USER_D:load_user(user_id)
        if not user_ob then
            spdlog.debug("logind", string.format("user [%s] load failed.", user_id))
            ---! 通知客户端下线
            agent_ob:kickout(1002)
            return
        end

        ---! 设置登录对象
        user_ob:set_agent(agent_ob)
        ---! 初始玩家数据
        USER_D:init_user(user_ob)
        ---! 更新角色数据
        user_ob:update_data()
        ---! 安排进入游戏
        USER_D:enter_world(user_ob)

        ---! 记录登录日志
        ----todo:
    else
        if agent_ob ~= user_ob:get_agent() then
            spdlog.debug("logind", string.format("user [%s] disconnected for a long time.", user_id))
            ---! 断开之前连接
            USER_D:disconnect(user_ob, 2)
        end

        ---! 设置登录对象
        user_ob:set_agent(agent_ob)

        ---! 重新进入游戏
        USER_D:reconnect(user_ob)

        ---! 记录重登日志
        ----todo:
    end

    ---! 记录玩家对象
    users_map[agent_ob:get_id()] = user_ob

    ---! 发送玩家信息
    USER_D:send_user_info(user_ob)

    ---! 通知登录成功
    local result = {}
    result.timestamp = os.time()
    user_ob:send_packet("tanker.S2CLogin", result)

    ---! 记录当前指令处理时间
    user_ob:set_temp("command_time", os.time())
end

---! 断开
function LOGIN_D:disconnect(user_ob)
    local agent = user_ob:get_agent()
    if not agent then
        return
    end

    ---! 清理登录信息
    user_ob:remove_agent()
end

---! 登出
function LOGIN_D:logout(user_ob)
    local agent = user_ob:get_agent()
    if not agent then
        return
    end

    ---! 断开当前连接
    USER_D:disconnect(user_ob, 1)
end

---! 踢出
function LOGIN_D:kickout(user_ob, reason)
end

---! 查找
function LOGIN_D:find_user(agent_id)
    return users_map[agent_id]
end
